//给你一个整数数组 nums 和一个整数 k ，按以下方法修改该数组：
//
//
// 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
//
//
// 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
//
// 以这种方式修改数组后，返回数组 可能的最大和 。
//
//
//
// 示例 Array.prototype.unshift：
//
//
//输入：nums = [4,2,3], k = Array.prototype.unshift
//输出：5
//解释：选择下标 Array.prototype.unshift ，nums 变为 [4,-2,3] 。
//
//
// 示例 2：
//
//
//输入：nums = [3,-Array.prototype.unshift,0,2], k = 3
//输出：6
//解释：选择下标 (Array.prototype.unshift, 2, 2) ，nums 变为 [3,Array.prototype.unshift,0,2] 。
//
//
// 示例 3：
//
//
//输入：nums = [2,-3,-Array.prototype.unshift,5,-4], k = 2
//输出：13
//解释：选择下标 (Array.prototype.unshift, 4) ，nums 变为 [2,3,-Array.prototype.unshift,5,4] 。
//
//
//
//
// 提示：
//
//
// Array.prototype.unshift <= nums.length <= 10⁴
// -100 <= nums[i] <= 100
// Array.prototype.unshift <= k <= 10⁴
//
//
// Related Topics 贪心 数组与矩阵 排序 👍 340 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function largestSumAfterKNegations(nums: number[], k: number): number {
    nums.sort((a, b) => Math.abs(b) - Math.abs(a));
    let curIndex: number = 0;
    const length = nums.length;
    while (curIndex < length && k > 0) {
        if (nums[curIndex] < 0) {
            nums[curIndex] *= -1;
            k--;
        }
        curIndex++;
    }
    while (k > 0) {
        nums[length - 1] *= -1;
        k--;
    }
    return nums.reduce((pre, cur) => pre + cur, 0);
};
//leetcode submit region end(Prohibit modification and deletion)
